﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;



using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Xml;
using System.IO;
using System.Security.Cryptography;
using System.Text.RegularExpressions;

namespace UserCenter
{
    /// <summary>
    /// UserCenterPanel.xaml 的交互逻辑
    /// </summary>
    public partial class UserCenterPanel : UserControl
    {
        public static string API = "";
        public static string Token = "";
        public static JObject UserInfor=null;

        private static bool isLoggedIn = false;

        // 定义登录成功事件
        public static event EventHandler<bool> LoginSuccessEvent;
        // 辅助方法，用于触发登录状态变化事件
        protected static void OnLoginSuccessChanged(bool loggedIn)
        {
            // 检查是否有订阅者，然后触发事件
            LoginSuccessEvent?.Invoke(null, loggedIn);
        }
        /// <summary>
        /// 登录标记
        /// </summary>
        public static bool IsLoggedIn
        {
            get { return isLoggedIn; }
            private set
            {
                if (isLoggedIn != value)
                {
                    isLoggedIn = value;
                    // 触发登录状态变化事件
                }
                OnLoginSuccessChanged(isLoggedIn);

            }
        }
        public UserCenterPanel(string api)
        {
            InitializeComponent();
            API = api;
            //应该读取配置文件，来确定是否自动登录
            //如果自动登录，就直接登录
            logPanel.Visibility = Visibility.Visible;

            ReadAutoLoginSetting();


        }


        private const string configFilePath = "UserCenterConfig.json"; // 配置文件的路径

        /// <summary>
        /// 读取配置文件中的 AutoLogin 配置项
        /// </summary>
        /// <returns></returns>
        public void ReadAutoLoginSetting()
        {
            try
            {
                if (!File.Exists(configFilePath))
                {
                    // 如果配置文件不存在，创建一个新的配置文件并写入默认值
                    CreateDefaultConfigFile();
                }

                // 读取 JSON 文件并解析为对象
                string jsonText = File.ReadAllText(configFilePath);
                Console.WriteLine("读取到的配置文件内容：" + jsonText);
                dynamic config = JsonConvert.DeserializeObject(jsonText);

                // 获取 AutoLogin 配置项的值
                autologin.IsChecked = config.AutoLogin;
                bool autoLoginEnabled = config.AutoLogin;

                if (autoLoginEnabled)
                {
                    string token = config.Token;
                    Console.WriteLine("自动登录，Token:" + config.Token);
                    loginToken(token);
                    //向服务器发送请求，验证token是否有效
                    //如果有效，就直接登录
                }
            }
            catch (Exception ex)
            {
                // 处理异常，例如配置文件格式不正确的情况
                Console.WriteLine("读取AutoLogin设置时出现异常：" + ex.Message);
            }
        }
        public class ConfigSettings
        {
            public bool AutoLogin { get; set; }
            public string Token { get; set; }
        }

        public void WriteConfigSettings(ConfigSettings settings)
        {
            try
            {
                // 将配置对象序列化为 JSON
                string jsonText = JsonConvert.SerializeObject(settings);

                // 写入 JSON 到配置文件
                File.WriteAllText(configFilePath, jsonText);
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入配置文件时出现异常：" + ex.Message);
            }
        }

        private void CreateDefaultConfigFile()
        {
            // 创建默认的配置对象
            var defaultConfig = new { AutoLogin = false,Token="" };

            // 将默认配置对象序列化为 JSON
            string jsonText = JsonConvert.SerializeObject(defaultConfig);

            // 将 JSON 写入配置文件
            File.WriteAllText(configFilePath, jsonText);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

        }


        /// <summary>
        /// 手动输入登录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void login(object sender, RoutedEventArgs e)
        {
            try
            {
                string apiUrl = API+"/login"; // 替换为实际的登录URL
                Console.WriteLine("登录URL：" + apiUrl);
                var loginInfo = new
                {
                    username = username.Text,
                    password = password.Password
                };

                using (var httpClient = new HttpClient())
                {
                    // 设置请求头（如果需要）
                    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    // 将登录信息序列化为JSON
                    string loginInfoJson = Newtonsoft.Json.JsonConvert.SerializeObject(loginInfo);

                    // 设置请求内容
                    var content = new StringContent(loginInfoJson, Encoding.UTF8, "application/json");

                    // 发送POST请求
                    var response = await httpClient.PostAsync(apiUrl, content);

                    // 检查响应是否成功
                    if (response.IsSuccessStatusCode)
                    {
                        string responseContent = await response.Content.ReadAsStringAsync();
                        //解析为json数据
                        JObject jo = (JObject)JsonConvert.DeserializeObject(responseContent);
                        Token = jo["token"].ToString();
                        UserInfor = (JObject)jo["user"];
                        // 读取响应内容
                        Console.WriteLine("登录成功，响应内容：" + responseContent);
                        if ((bool)autologin.IsChecked)
                        {
                            Console.WriteLine("设置自动登录");
                            WriteConfigSettings(new ConfigSettings()
                            {
                               AutoLogin=true,
                               Token=Token
                            });

                        }
                        else
                        {
                            Console.WriteLine("设置自动登录");
                            WriteConfigSettings(new ConfigSettings()
                            {
                                AutoLogin = false,
                                Token = ""
                            });

                        }
                        IsLoggedIn = true;
                        afterLoginSuccess();
                        //用户信息面板
                    }
                    else
                    {
                        Console.WriteLine("登录失败，响应状态码：" + response.StatusCode);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("发生异常：" + ex.Message);
            }
        }


        /// <summary>
        /// 自动登录
        /// </summary>
        /// <param name="token"></param>
        private async void loginToken(string token)
        {
            Console.WriteLine("!!!登录Token：" + token);
            // 设置 API 地址
            string apiUrl = API+"/logintoken"; // 替换为实际的API URL
            Console.WriteLine("登录URL：" + apiUrl+token);
            // 创建 HttpClient 实例
            using (HttpClient client = new HttpClient())
            {
                try
                {
                    //client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
                    client.DefaultRequestHeaders.Add("Authorization", token);

                    // 发送 HTTP DELETE 请求到登录用户使用 Token 的接口
                    HttpResponseMessage response = await client.DeleteAsync(apiUrl);
                    // 检查响应状态码
                    if (response.IsSuccessStatusCode)
                    {
                        string jsonResult = await response.Content.ReadAsStringAsync();
                        JObject jo = (JObject)JsonConvert.DeserializeObject(jsonResult);
                        Token = (string)jo["token"];
                        UserInfor = (JObject)jo["user"];
                        afterLoginSuccess();
                        WriteConfigSettings(new ConfigSettings()
                        {
                            AutoLogin = true,
                            Token = Token
                        });
                        //用户信息面板
                        IsLoggedIn = true;
                    }
                    else
                    {
                        Console.WriteLine($"API request failed with status code: {response.StatusCode}");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"API request failed with error: {ex.Message}");
                }
            }
        }


        private void afterLoginSuccess()
        {
            //清除面板信息
            username.Text = "";
            password.Password = "";
            autologin.IsChecked = false;

            //登录成功后，隐藏登录界面
            logPanel.Visibility = Visibility.Hidden;

            //显示用户信息界面
            userInforPanel.Visibility = Visibility.Visible;

            // 显示用户信息
            // 请替换下面的x:Name属性为你的实际TextBlock名称
            // 确保UserInfor已经包含了所有必要的数据

            // 显示ID
            userId.Text = UserInfor["id"]?.ToString() ?? "N/A";

            // 显示用户名
            userName.Text = UserInfor["username"]?.ToString() ?? "N/A";

            // 显示电子邮箱
            userEmail.Text = UserInfor["email"]?.ToString() ?? "N/A";

            // 显示电话
            userPhone.Text = UserInfor["phone"]?.ToString() ?? "N/A";

            // 显示角色
            userRole.Text = UserInfor["role"]?.ToString() ?? "N/A";

            // 显示状态
            userStatus.Text = UserInfor["status"]?.ToString() ?? "N/A";

            // 显示自定义字段
            userCustomField.Text = UserInfor["custom_field"]?.ToString() ?? "N/A";

            // 其他信息（如头像、余额、等级、积分等）可以类似地添加
            // 例如:
            // userAvatar.Source = new BitmapImage(new Uri(UserInfor["avatar"]?.ToString() ?? "default_avatar_path"));
            // userBalance.Text = UserInfor["balance"]?.ToString() ?? "0";
        }

        private async void register(object sender, RoutedEventArgs e)
        {

            logPanel.Visibility = Visibility.Hidden;
            regPanel.Visibility = Visibility.Visible;

        }

        private void findpassword(object sender, RoutedEventArgs e)
        {

        }



        private void recharge(object sender, RoutedEventArgs e)
        {

        }

        private void usercenterload(object sender, RoutedEventArgs e)
        {
            //检查最后一次登录的账号，是否设置了自动登录
            //如果设置了自动登录，直接登录
            //如果没有设置自动登录，显示登录界面
            //如果没有登录过，显示登录界面

        }

        /// <summary>
        /// 手动注销操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void logout(object sender, RoutedEventArgs e)
        {
            // 1. 设置 API 地址。这是你的服务器端注销API。
            string apiUrl = API + "/logout";

            // 2. 创建 HttpClient 实例
            using (HttpClient client = new HttpClient())
            {
                try
                {
                    // 添加授权头。这通常是你的登录令牌。
                    //client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token);
                    client.DefaultRequestHeaders.Add("Authorization", Token);

                    // 3. 发送注销请求到服务器。这里使用了POST请求，但具体情况取决于你的API。
                    HttpResponseMessage response = await client.DeleteAsync(apiUrl);

                    // 4. 检查响应状态码
                    if (response.IsSuccessStatusCode)
                    {
                        // 注销成功
                        Console.WriteLine("注销成功");

                        // 5. 清除本地用户信息
                        Token = "";
                        UserInfor = null;
                        IsLoggedIn = false;

                        // 6. 更新UI，如隐藏用户信息面板，显示登录面板等
                        userInforPanel.Visibility = Visibility.Hidden;
                        logPanel.Visibility = Visibility.Visible;

                        // 7. 可以选择更新配置文件，取消自动登录
                        WriteConfigSettings(new ConfigSettings() { AutoLogin = false, Token = "" });
                    }
                    else
                    {
                        // 注销失败，处理错误
                        Console.WriteLine($"注销失败，响应状态码：{response.StatusCode}");
                    }
                }
                catch (Exception ex)
                {
                    // 处理连接错误等
                    Console.WriteLine($"注销请求失败：{ex.Message}");
                }
            }
        }

        private async void makecount_Click(object sender, RoutedEventArgs e)
        {
            // 验证输入
            if (!IsValidUsername(regUser.Text))
            {
                Console.WriteLine("用户名不合法");
                return;
            }

            if (!IsValidEmail(regEmail.Text))
            {
                Console.WriteLine("电子邮件地址不合法");
                return;
            }

            if (!IsValidPhone(regPhone.Text))
            {
                Console.WriteLine("手机号码不合法");
                return;
            }

            if (!IsValidPassword(regPassword.Password))
            {
                Console.WriteLine("密码不合法");
                return;
            }

            // 确认密码逻辑（确保你有两个密码框，一个用于密码，一个用于确认密码）
            if (regPassword.Password != regPssCfm.Password)
            {
                Console.WriteLine("两次输入的密码不一致");
                return;
            }



            // 设置服务器的注册接口地址
            string registerUrl = API + "/register";

            // 创建请求体的JSON字符串
            JObject keyValuePairs = new JObject();
            keyValuePairs.Add("username", regUser.Text);
            keyValuePairs.Add("password", regPassword.Password);
            keyValuePairs.Add("email", regEmail.Text);
            keyValuePairs.Add("phone", regPhone.Text);
            keyValuePairs.Add("role", "");
            keyValuePairs.Add("status", "");
            keyValuePairs.Add("custom_field", "");
            
            // 创建 HttpClient 实例
            using (HttpClient client = new HttpClient())
            {
                try
                {
                    // 设置请求头为接受 JSON
                    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

                    // 创建请求内容
                    StringContent content = new StringContent(keyValuePairs.ToString(), Encoding.UTF8, "application/json");

                    // 发送 POST 请求
                    HttpResponseMessage response = await client.PostAsync(registerUrl, content);

                    // 检查响应状态码是否表示成功
                    if (response.IsSuccessStatusCode)
                    {
                        // 读取响应内容
                        string responseBody = await response.Content.ReadAsStringAsync();
                        Console.WriteLine("注册成功: " + responseBody);

                        regNotic.Visibility= Visibility.Visible;
                        regNotic.Text = "注册成功：请账住账号密码。。";
                        MessageBox.Show("注册成功：请账住账号密码。。");
                        regPhone.Text = "";
                        regEmail.Text = "";
                        regUser.Text = "";
                        regPassword.Password = "";
                        regPssCfm.Password = "";
                        regPanel.Visibility = Visibility.Hidden;
                        logPanel.Visibility = Visibility.Visible;

                    }
                    else
                    {
                        Console.WriteLine("注册失败, 状态码: " + response.StatusCode);
                        regNotic.Text = response.StatusCode.ToString();

                    }
                }
                catch (Exception ex)
                {
                    // 处理异常
                    Console.WriteLine("请求失败: " + ex.Message);
                    regNotic.Text = ex.Message;
                }
            }


        }


        bool IsValidUsername(string username)
        {
            // 英文，数字，六位以上
            return Regex.IsMatch(username, @"^[a-zA-Z0-9]{6,}$");
        }

        bool IsValidEmail(string email)
        {
            // 简单的电子邮件地址验证
            return Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
        }

        bool IsValidPhone(string phone)
        {
            // 适用于大多数国际号码的简单验证（可能需要调整以符合特定地区的格式）
            return Regex.IsMatch(phone, @"^\+?[1-9]\d{1,14}$");
        }

        bool IsValidPassword(string password)
        {
            // 英文，数字，六位以上
            return Regex.IsMatch(password, @"^[a-zA-Z0-9]{6,}$");
        }


    }
}
